#include <pthread.h>
#include <queue>

using namespace std;
queue <int> q;
pthread_mutex_t mutex; //互斥量:锁


void text() {
    pthread_mutex_lock(&mutex);
    printf("队列的大小 %d\n", q.size());
    pthread_mutex_unlock(&mutex);
}

void *pop(void *args) {
    pthread_mutex_lock(&mutex);
    // 线程未同步导致的多线程安全问题
    // 会有重复的数据取出并出现异常
    if (!q.empty()) {
        printf("取出数据:%d\n", q.front());
        q.pop();
    } else {
        printf("无数据\n");
    }
    text(); // 死锁Linux
    pthread_mutex_unlock(&mutex);
    return 0;
}

int main() {
    // 初始化互斥锁
    // 非递归锁 参数0
    // 锁的属性 : pthread_mutex_t锁默认是非递归的
    pthread_mutexattr_t attr;
    pthread_mutexattr_init(&attr);
    // 设置为递归锁
    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
    // 初始化mutex
    pthread_mutex_init(&mutex, &attr);
    // 完成初始化后即可释放
    pthread_mutexattr_destroy(&attr);

    for (size_t i = 5; i < 10; i++) {
        q.push(i);
    }
    pthread_t pid[10];

    for (size_t i = 0; i < 10; i++) {
        pthread_create(&pid[i], 0, pop, &q);
    }

    pthread_mutex_destroy(&mutex);

    puts("after inback Press any key to continue...");
    system("stty raw");
    getchar();
    system("stty cooked");

    return 0;
}